package com.itjin.health.service;

import com.itjin.health.domain.dto.ForgetPasswordStep1Request;
import com.itjin.health.domain.dto.ForgetPasswordStep2Request;
import com.itjin.health.domain.dto.UserLoginRequest;
import com.itjin.health.domain.dto.UserRegisterRequest;
import com.itjin.health.domain.dto.UserUpdateInfoRequest;
import com.itjin.health.domain.entity.User;
import com.itjin.health.domain.vo.UserComprehensiveInfoVO;
import com.itjin.health.domain.vo.UserStatsVO;
import com.itjin.health.domain.vo.UserVO;

public interface UserService {

  /**
   * 用户注册
   *
   * @param userRegisterRequest 注册请求
   * @return 用户id
   */
  Integer userRegister(UserRegisterRequest userRegisterRequest);

  /**
   * 用户登录
   *
   * @param userLoginRequest 登录请求
   * @return 脱敏后的用户信息
   */
  UserVO userLogin(UserLoginRequest userLoginRequest);

  /**
   * 获取当前登录用户
   *
   * @param userId 用户id
   * @return 脱敏后的用户信息
   */
  UserVO getLoginUser(Integer userId);

  /**
   * 用户脱敏
   *
   * @param user 用户信息
   * @return 脱敏后的用户信息
   */
  UserVO getUserVO(User user);

  /**
   * 验证邮箱验证码
   *
   * @param email   邮箱
   * @param captcha 验证码
   * @return 是否验证成功
   */
  boolean verifyCaptcha(String email, String captcha);

  /**
   * 忘记密码第一步：验证身份
   *
   * @param request 忘记密码第一步请求
   * @return 重置令牌
   */
  String forgetPasswordStep1(ForgetPasswordStep1Request request);

  /**
   * 忘记密码第二步：重置密码
   *
   * @param request 忘记密码第二步请求
   * @return 是否成功
   */
  boolean forgetPasswordStep2(ForgetPasswordStep2Request request);

  /**
   * 获取用户统计信息
   *
   * @param userId 用户ID
   * @return 用户统计信息
   */
  UserStatsVO getUserStats(Integer userId);

  /**
   * 获取用户全面信息
   * 
   * @param userId 用户ID
   * @return 用户全面信息
   */
  UserComprehensiveInfoVO getUserComprehensiveInfo(Integer userId);

  /**
   * 更新用户信息
   * 
   * @param userId        用户ID
   * @param updateRequest 更新请求
   * @return 是否更新成功
   */
  boolean updateUserInfo(Integer userId, UserUpdateInfoRequest updateRequest);
}